草庐IT

Java Swingworker 和多线程

全部标签

c++ - 当协程切换线程时,如何强制 Linux 上的 g++ 更新线程指针(用于 TLS)?

我在C++(编译器g++,在ARM上)中使用协程的自定义实现。协程可能会通过调用move_to_thread函数(或其他方式,但这将让我说明我的观点)从一个线程迁移到另一个线程。我过于简单化了,但它有点像这样:__threadintx=0;voidf(){x=5;//dosomemoreworkoncurrentthread(thread1,say)move_to_thread(2);//domorework,nowonthread2inty=x;//withoptimization,I'mgettingthewrongx}我遇到的问题是调用move_to_thread之前和之后完成的

java - 如何以定义明确的线程安全方式将 C++ 字符串传递给 Java JNI?

有一个C++函数,通过JNI从Java代码调用。我想将底层的c字符串正确地传递给Java,所以我做了以下安排://main.cppstringglobal;constchar*data()//CalledexternallybyJNI{return(global=func_returning_string()).data();//`.data()`=`.c_str()`}但在这种情况下,函数data()不再是线程安全的。在传递字符串而不导致任何未定义行为的情况下实现线程安全的最佳方法是什么? 最佳答案 Iwanttopasstheu

c++ - 如何通过id获取线程对象?

假设某个线程具有其他线程的std::thread::idmyId。现在我想检索与myId关联的std::thread对象,这样我就可以.join()它了。在std中有可能吗?还是我必须手动跟踪它? 最佳答案 如果可以避免,我不推荐这样做。即使在它可以工作的平台上,它也是一个糟糕的设计。我将其作为学术练习来满足好奇心。AFIK没有标准的方法来做到这一点。如果您不需要便携性并且您真的想要这样做......在某些平台上(例如Mac和可能的Linux)std::thread将只是底层pthread_t的包装器,因为它是相同的作为您已经拥有的

c++ - 正在访问指针元组的元组和线程安全的互斥锁

给定std::tuple,usingTuple1=std::tuple>;usingTuple2=std::tuple>;std::tupletuple;还有函数,voidbaz(){autotup=std::get(tuple);std::lock_guardlk(*std::get(tup));//Dosomethingwithstd::get(tup)andstd::get(tup)}根据this关于SO访问std::tuple的问题本质上不是线程安全的,但是在示例代码的情况下呢?是否有可能发生未定义/奇怪的事情?这是假设FooN和BarN仅在锁定后才被访问。

c++ - 确保当前线程持有 C++11 互斥锁

有没有办法判断C++11中的当前线程是否持有互斥锁?特别是我想确保类中的某些函数仅在调用线程持有锁时被调用(通过std::lock_guard、std::unique_lock或类似的东西)对于对象,std::mutex是一个成员变量。为了避免在对象被广泛使用时重复锁定和解锁,锁定mutex的责任需要由调用者负责,不能在每个单独的函数中,如果当前当调用这些函数中的任何一个时,线程没有锁定mutex,我想抛出异常。看来我不能只使用std::try_lock然后根据需要进行解锁,因为如果当前线程std::try_lock的行为是未定义的已经持有锁。 最佳答案

c++ - Python GIL 和线程

我在我的大型C++应用程序中嵌入了Python3。Python赋予了用户自定义数据处理脚本的能力。问题:我有许多与Python交互的线程,但我并不真正了解如何使用GIL保护我的代码。到目前为止,我使代码正常工作的唯一方法是使用boost::mutex。这是一个重现我的问题的非常简单的例子:线程A首先调用Init()来初始化Python(静态函数)。线程B调用Pythonize()在Python上做一些工作。线程B在第一次调用锁定GIL时被阻塞。代码:#include#include#include#include"Python.h"structRTMaps_GILLock{RTMaps

c++ - std::promise<T> 是线程安全的吗?

它安全吗,就像std::mutex的情况一样对于std::promise待制mutable,还是取决于T?如:usingData=std::tuple;structX{std::futureprepare()const{returnm_promise.get_future();}voidasyncHandler(inta,intb)const{m_promise.set_value({true,a,b});}voidcancel()const{m_promise.set_value({false,0,0});}mutablestd::promisem_promise;//Isthiss

c++ - 在 gdb 中使用核心转储时,我如何确切知道哪个线程导致了 SIGSEGV?

这个问题在这里已经有了答案:HowtofindwhichthreadcausedSEGFAULTinapost-mortemgdbsession?(1个回答)关闭7年前。我的应用程序使用了8个以上的线程。当我在gdb中运行infothreads时,我看到线程和它们正在执行的最后一个函数。对我来说,究竟是哪个线程导致了SIGSEGV似乎并不明显。有可能告诉它吗?是线程1吗?线程是如何编号的?

c++ - 在一个线程中新建并在另一个线程中删除,不允许吗?

我正在从com端口读取数据。因为不知道什么时候有数据,所以一直在一个线程里读。当我读取了足够多的字节后,我通过发布一strip有指向字符串指针的消息让主线程知道这一点:msg[i]='\0';completeMsg=newchar[i];strcpy(completeMsg,msg);PostMessage(hDlg,BT_MSG,NULL,(LPARAM)completeMsg);i=0;主线程对此消息的响应是:caseBT_MSG:{char*msg=(char*)lParam;ShowMsg(msg);delete[]msg;break;}但似乎不允许在此线程中删除,因为我在执行

c++ - boost::interprocess 互斥与 boost 线程互斥

我刚刚意识到它在Boost中似乎有两个互斥“世界”。boost::interprocess下的一些互斥体和boost::thread..下的互斥体的定义可以互换使用吗?例如scoped_lockwithboost::wait? 最佳答案 据我所知,您可以使用进程间互斥而不是boost::threadmutex,但考虑到它们可能会更慢,因为它们打算在进程间内存中运行。您不能使用线程中的同步机制并在进程间使用它们,这些根本不是为多进程同步设计的。 关于c++-boost::interproc